package handler;

import dao.*;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import org.primefaces.event.DateSelectEvent;
import pojo.Categoria;
import pojo.Exemplar;
import pojo.Filme;
import pojo.Locacao;

/**
 *
 * @author Vanessinha
 */
@Named(value = "locacaoHandler")
@SessionScoped
public class LocacaoHandler implements Serializable {

    @EJB
    private LocacaoDao locacaodao = new LocacaoDao();
    @EJB
    private ClienteDao clientedao = new ClienteDao();
    @EJB
    private FuncionarioDao funcionariodao = new FuncionarioDao();
    @EJB
    private ExemplarDao exemplardao = new ExemplarDao();
    @EJB
    private CategoriaDao categoriadao = new CategoriaDao();
    @EJB
    private FilmeDao filmesDao = new FilmeDao();
    private Exemplar exemplar = new Exemplar();
    private Locacao locacao = new Locacao();
    private List<Locacao> listalocacao = new ArrayList<>();
    private Locacao excluido;
    private long idCliente;
    private long idFuncionario;
    private long idCategoria;
    private long idExemplar;
    private long idFilme;
    private double total = 0;
    private List<Exemplar> exemplares = new ArrayList<>();
    private List<Exemplar> listaDisponiveis = new ArrayList<>();
    private List<Filme> filmes = new ArrayList<>();
    private List<Exemplar> exemplaresDisponiveis = new ArrayList<>();

    public Double getTotal() {
        return total;
    }

    public void setTotal(Double total) {
        this.total = total;
    }

    public List<Exemplar> getExemplaresDisponiveis() {
        return exemplaresDisponiveis;
    }

    public void setExemplaresDisponiveis(List<Exemplar> exemplaresDisponiveis) {
        this.exemplaresDisponiveis = exemplaresDisponiveis;
    }

    public LocacaoHandler() {

        if (FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario") == null) {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("Login.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CategoriaHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            exemplares = new ArrayList<>();
            listaDisponiveis = new ArrayList<>();
            filmes = new ArrayList<>();
            exemplaresDisponiveis = new ArrayList<>();
            filmesDao = new FilmeDao();
            exemplar = new Exemplar();
            locacao = new Locacao();
            listalocacao = new ArrayList<>();
            total = 0;
            excluido = new Locacao();
        }


    }

    public long getIdFilme() {
        return idFilme;
    }

    public void setIdFilme(long idFilme) {
        this.idFilme = idFilme;
    }

    public List<Filme> getFilmes() {
        return filmes;
    }

    public void setFilmes(List<Filme> filmes) {
        this.filmes = filmes;
    }

    public List<Exemplar> listaDisponiveis() {
        return null;// listaDisponiveis = exemplardao.listaExemplaresDisponiveis();
    }

    public Locacao getExcluido() {
        return excluido;
    }

    public void setExcluido(Locacao excluido) {
        this.excluido = excluido;
    }

    public Exemplar getExemplar() {
        return exemplar;
    }

    public void setExemplar(Exemplar exemplar) {
        this.exemplar = exemplar;
    }

    public List<Exemplar> getExemplares() {
        return exemplares;
    }

    public void setExemplares(List<Exemplar> exemplares) {
        this.exemplares = exemplares;
    }

    public long getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(long idCategoria) {
        this.idCategoria = idCategoria;
    }
    public long getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(long idCliente) {
        this.idCliente = idCliente;
    }

    public long getIdExemplar() {
        return idExemplar;
    }

    public void setIdExemplar(long idExemplar) {
        this.idExemplar = idExemplar;
    }

    public long getIdFuncionario() {
        return idFuncionario;
    }

    public void setIdFuncionario(long idFuncionario) {
        this.idFuncionario = idFuncionario;
    }

    public List<Exemplar> getListaDisponiveis() {
        return listaDisponiveis;
    }

    public void setListaDisponiveis(List<Exemplar> listaDisponiveis) {
        this.listaDisponiveis = listaDisponiveis;
    }

    public List<Locacao> getListalocacao() {
        return listalocacao;
    }

    public void setListalocacao(List<Locacao> listalocacao) {
        this.listalocacao = listalocacao;
    }

    public Locacao getLocacao() {
        return locacao;
    }

    public void setLocacao(Locacao locacao) {
        this.locacao = locacao;
    }

    public String salvar() {
        if (locacao.getLocData().after(locacao.getLocdataPrevDevolucao())) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                    "Datas Inválidas", "Data de locação deve ser menor que data de devolução"));
        } else if (exemplares.isEmpty()) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "CAMPOS OBRIGATÓRIOS", "Filmes devem ser selecionadas."));
        } else {
            locacao.setExemplares(exemplares);
            locacao.setLoccodCategoria(categoriadao.pesquisar(idCategoria));
            locacao.setLoccodCliente(clientedao.pesquisar(idCliente));
            locacao.setLoccodFuncionario(funcionariodao.pesquisar(idFuncionario));
            locacaodao.inserir(locacao);
            locacao = new Locacao();
            exemplares = new ArrayList<>();
            total = 0.0;
            cancelar();
            
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "CONFIRMAÇÃO",
                    "Cadastrado realizado com sucesso!"));
        }
        cancelar();
        total = 0;
        return "CadastroLocacao.xhtml";
    }

    public List<Locacao> listalocacao() {
        return listalocacao = locacaodao.getAll();
    }

    public void alterar(Locacao obj) {
        obj = locacaodao.pesquisar(obj.getLocCodigo());
        idCategoria = obj.getLoccodCategoria().getCatCodigo();
        idCliente = obj.getLoccodCliente().getCliCodigo();
        exemplares = obj.getExemplares();
        idFuncionario = obj.getLoccodFuncionario().getFunCodigo();
        this.locacao = obj;
    }

    public String cancelar() {
        locacao = new Locacao();
        idCategoria = 0L;
        idFilme = 0L;
        idCliente = 0L;
        idExemplar = 0L;
        idFuncionario = 0L;
        exemplares = new ArrayList<>();
        total = 0;
        return "CadastroLocacao.xhtml";
    }

    public String adicionarExemplar() {
        Exemplar ex = exemplardao.pesquisar(idExemplar);
        exemplares.add(ex);
        total = total + ex.getExe_codFilme().getFil_preco_locacao();
        System.out.println("TOTAL-----" + total);

        for (Exemplar p : listaDisponiveis) {
            if (p.getCod_exemplar().equals(idExemplar)) {
                listaDisponiveis.remove(ex);
                idExemplar = 0L;
                break;
            }
        }

        return "CadastroLocacao.xhtml";
    }

    public double getCount() {
        return locacao.getTotal();
    }

    public String removerExemplar(Exemplar obj) {
        this.locacao.getExemplares().remove(obj);
        this.exemplares.remove(obj);
        idCategoria = 0L;
        idCliente = 0L;
        idFuncionario = 0L;
        idExemplar = 0L;
        listaDisponiveis.add(obj);
        total -= obj.getExe_codFilme().getFil_preco_locacao();
        return "CadastroLocacao.xhtml";
    }

    public void invocaServletLocacao() {
        try {
            String url = "ServletLocacao?CMD=relatorio";
            FacesContext.getCurrentInstance().getExternalContext().redirect(url);
        } catch (IOException ex) {
            Logger.getLogger(LocacaoHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void invocaServletLocacoesData() {
        try {
            String url = "ServletData?CMD=relatorio";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            url += "&dataInicio=" + sdf.format(locacao.getLocData());
            url += "&dataFim=" + sdf.format(locacao.getLocdataPrevDevolucao());
            FacesContext.getCurrentInstance().getExternalContext().redirect(url);
        } catch (IOException ex) {
            Logger.getLogger(LocacaoHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void invocaServletFilme() {
        try {
            String url = "ServletFilme?CMD=relatorio";
            FacesContext.getCurrentInstance().getExternalContext().redirect(url);
        } catch (IOException ex) {
            Logger.getLogger(LocacaoHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void invocaServletCliente() {
        try {
            String url = "ServletCliente?CMD=relatorio";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            url += "&dataInicio=" + sdf.format(locacao.getLocData());
            url += "&dataFim=" + sdf.format(locacao.getLocdataPrevDevolucao());
            url += "&cliente=" + idCliente;
            FacesContext.getCurrentInstance().getExternalContext().redirect(url);
        } catch (IOException ex) {
            Logger.getLogger(LocacaoHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Filme> popularFilmes() {
        Categoria c = categoriadao.pesquisar(idCategoria);
        filmes = c.getFilmes();
        return c.getFilmes();
    }

    public void popularExemplares() {
        Filme f ;
        f = filmesDao.pesquisar(idFilme);
        exemplaresDisponiveis = exemplardao.listaExemplaresDisponiveis(f);
    }

   
}
